Amazon Redshift:UNLOADコマンドでZSTDオプションが使えるようになりました
小ネタです。
Amazon Redshiftの更新履歴にて『UNLOADコマンド実行時のオプションでZSTD形式での出力が出来るようになりました』との旨、記載がありました。
当エントリでは簡潔ではありますが、当オプションについて内容を見てみたいと思います。
『Zstandard (ZSTD) エンコーディング』とは
作成したテーブルのカラムに対する列圧縮タイプの指定時
ZSTDエンコーディングそのものの内容については、AWS公式ドキュメントに簡潔にまとまっているものが有りましたのでそのまま引用します。全てのデータ型をサポートしている、比較的使い勝手の良い指定方法と言えますね。
Zstandard (ZSTD) エンコーディングは、多様なデータセット間で非常にパフォーマンスのいい高圧縮比率を提供します。ZSTD は、製品説明、ユーザーのコメント、ログ、JSON 文字列など、長さがさまざまな文字列を保存する CHAR および VARCHAR 列に対して、特に効果を発揮します。デルタ エンコードや Mostly エンコードのような一部のアルゴリズムでは非圧縮時よりも多くのストレージスペースを使用する場合があるのと異なり、ZSTD ではディスク使用量が増えることはほとんどありません。ZSTD では、Amazon Redshift のすべてのデータ型がサポートされています。
COPY処理によるデータ取り込み時の指定時
ZSTDオプション指定は、データの取り込み(COPY)を行う際にも指定が可能です。
ZSTD 入力ファイルが圧縮された Zstandard 形式 (.zst ファイル) であることを指定する値です。COPY 操作では、圧縮されたそれぞれのファイルを読み取り、ロード時にデータを解凍します。詳細については、「ZSTD」を参照してください。 注記 ZSTD は、Amazon S3 から COPY を使用する場合のみサポートされます。
UNLOAD実行時(←New!!)
そして今回新しく対応するようになったのが、データのエクスポートを行う『UNLOAD』コマンドにおける部分です。
記法について確認してみます。ZSTDオプションの記載が確認出来ますね。
UNLOAD ('select-statement') TO 's3://object-path/name-prefix' authorization [ option [ ... ] ] where option is { MANIFEST [ VERBOSE ] | HEADER | [ FORMAT [AS] ] CSV | DELIMITER [ AS ] 'delimiter-char' | FIXEDWIDTH [ AS ] 'fixedwidth-spec' } | ENCRYPTED | BZIP2 | GZIP | ZSTD | ADDQUOTES | NULL [ AS ] 'null-string' | ESCAPE | ALLOWOVERWRITE | PARALLEL [ { ON | TRUE } | { OFF | FALSE } ] | MAXFILESIZE [AS] max-size [ MB | GB ] ] | REGION [AS] 'aws-region'
まずはUNLOADコマンドの実行。ZSTDオプションを指定し、ファイルとして出力する事が出来ました。
# UNLOAD ('SELECT * FROM public.superstore_orders ORDER BY order_date, order_id;') TO 's3://xxxxxxxxxxxxxx/yyyyyy/superstore_orders_' IAM_ROLE 'arn:aws:iam::123456789012:role/xxxxxxxxxxxx-redshift-role' CSV ZSTD PARALLEL OFF ALLOWOVERWRITE; INFO: UNLOAD completed, 10000 record(s) unloaded successfully. UNLOAD Time: 805.001 ms
出力されたファイル存在を確認しダウンロード。
$ aws s3 ls 's3://xxxxxxxxxx/public/' 2019-04-18 xx:xx:xx 328183 superstore_orders_000.zst $ aws s3 cp 's3://xxxxxxxxxx/public/superstore_orders_000.zst' /Users/xxxxxxxxxxxx/Desktop/superstore_orders_000.zst download: s3://xxxxxxxxxx/public/superstore_orders_000.zst to ../Desktop/superstore_orders_000.zst
ダウンロード完了したファイルに対し、zstdコマンド実行。対象ファイルの情報を確認出来ました。
$ brew install zstd $ zstd -l /Users/xxxxxxxxxx/Desktop/superstore_orders_000.zst Frames Skips Compressed Uncompressed Ratio Check Filename 1 0 320.49 KB None /Users/xxxxxxxxxx/Desktop/superstore_orders_000.zst
続いて、UNLOADしたzstdファイルを、『同一テーブル定義』且つ『別名』のテーブルに投入し直してみます。ZSTDオプションの指示に従い、データを連携出来ることを確認しました。
CREATE TABLE IF NOT EXISTS "public"."superstore_orders_dup" ( "row_id" INTEGER NOT NULL ENCODE lzo ,"order_id" VARCHAR(25) NOT NULL ENCODE lzo ,"order_date" DATE NOT NULL ENCODE delta ,"ship_date" DATE NOT NULL ENCODE delta ,"ship_mode" VARCHAR(30) NOT NULL ENCODE bytedict ,"customer_id" VARCHAR(25) NOT NULL ENCODE lzo ,"customer_name" VARCHAR(100) NOT NULL ENCODE lzo ,"customer_segment" VARCHAR(30) NOT NULL ENCODE lzo ,"city" VARCHAR(30) ENCODE lzo ,"prefecture" VARCHAR(30) NOT NULL ENCODE lzo ,"nation" VARCHAR(20) NOT NULL ENCODE lzo ,"region" VARCHAR(30) NOT NULL ENCODE lzo ,"product_id" VARCHAR(40) NOT NULL ENCODE lzo ,"product_category" VARCHAR(40) NOT NULL ENCODE lzo ,"product_sub_category" VARCHAR(50) NOT NULL ENCODE lzo ,"product_name" VARCHAR(200) NOT NULL ENCODE lzo ,"sales" DOUBLE PRECISION ,"amount" INTEGER NOT NULL ENCODE lzo ,"discount_rate" DOUBLE PRECISION ,"profit" DOUBLE PRECISION ,PRIMARY KEY (order_date) ) DISTSTYLE EVEN SORTKEY ( "order_date" , "order_id" , "customer_id" , "product_id" ) ; CREATE TABLE Time: 407.020 ms # COPY public.superstore_orders_dup FROM 's3://xxxxxxxxxx/public/superstore_orders_000.zst' IAM_ROLE 'arn:aws:iam::123456789012:role/xxxxxxxxxxxxx-role' CSV ZSTD; INFO: Load into table 'superstore_orders_dup' completed, 10000 record(s) loaded successfully. COPY Time: 10397.502 ms (00:10.398)
まとめ
という訳で、Amazon RedshiftのUNLOADコマンドにおける『ZSTD』オプションが利用出来るようになった、というお知らせでした。Redshiftにおけるファイル取り回しに関する部分で、一通りの箇所で『ZSTD』オプションが使えるようになったことでデータ分析基盤の作業も効率化が図りやすくなるのではないでしょうか。